/**
 * XL-Payment 虚拟货币支付适配器
 * 处理平台积分、代金券等虚拟支付方式
 */
import { formatAmount, delay } from '../utils';

export default class VirtualAdapter {
  constructor() {
    this.name = 'virtual';
    this.title = '积分支付';
  }
  
  /**
   * 发起虚拟货币支付
   * @param {Object} options 支付参数
   * @returns {Promise} 支付结果
   */
  async pay(options) {
    const { order, amount, config } = options;
    
    try {
      // 虚拟货币支付必须启用
      if (!config || !config.enabled) {
        throw new Error('虚拟货币支付未启用');
      }
      
      // 检查是否有余额查询函数
      if (typeof config.checkBalance !== 'function') {
        throw new Error('未配置余额检查函数');
      }
      
      // 计算所需虚拟货币数量
      const rate = config.rate || 100; // 兑换比率，默认100积分=1元
      const requiredPoints = Math.ceil(amount * rate);
      
      // 检查用户余额
      const balanceResult = await config.checkBalance();
      if (!balanceResult.success) {
        throw new Error('查询余额失败: ' + balanceResult.message);
      }
      
      const userBalance = balanceResult.balance || 0;
      
      // 检查余额是否足够
      if (userBalance < requiredPoints) {
        return {
          success: false,
          message: `${config.name || '积分'}不足，还差${requiredPoints - userBalance}${config.name || '积分'}`,
          insufficientFunds: true,
          requiredPoints,
          userBalance,
          order
        };
      }
      
      // 模拟扣减积分的网络请求
      const deductResult = await this._deductPoints(order, requiredPoints, config);
      
      if (!deductResult.success) {
        throw new Error('扣减失败: ' + deductResult.message);
      }
      
      // 返回支付成功结果
      return {
        success: true,
        message: `使用${requiredPoints}${config.name || '积分'}支付成功`,
        amount,
        points: requiredPoints,
        order,
        paymentType: 'virtual'
      };
    } catch (error) {
      console.error('虚拟货币支付失败:', error);
      return { 
        success: false, 
        message: '支付失败: ' + (error.message || error),
        error,
        order
      };
    }
  }
  
  /**
   * 模拟扣减积分
   * @param {Object} order 订单信息
   * @param {Number} points 积分数量
   * @param {Object} config 配置
   * @returns {Promise} 扣减结果
   */
  async _deductPoints(order, points, config) {
    // 模拟网络请求
    await delay(500);
    
    // 在实际项目中，应该调用服务端接口扣减用户积分
    // 这里仅作为演示
    
    // 模拟成功
    return {
      success: true,
      message: '扣减成功',
      deductPoints: points,
      balance: 0, // 假设扣减后余额为0
      tradeNo: 'virtual_' + Date.now()
    };
  }
  
  /**
   * 查询订单
   * @param {Object} options 查询参数
   * @returns {Promise} 查询结果
   */
  async queryOrder(options) {
    const { order, config } = options;
    
    try {
      // 实际项目中，这里应该向服务端请求查询
      await delay(300);
      
      // 虚拟货币支付通常为即时到账，直接返回成功
      return {
        success: true,
        status: 'PAID',
        message: '支付成功',
        paidAt: order.createdAt, // 使用创建时间作为支付时间
        orderId: order.id,
        paymentType: 'virtual'
      };
    } catch (error) {
      console.error('查询虚拟货币支付失败:', error);
      return { 
        success: false,
        message: '查询失败: ' + (error.message || error),
        error,
        orderId: order.id
      };
    }
  }
  
  /**
   * 退款
   * @param {Object} options 退款参数
   * @returns {Promise} 退款结果
   */
  async refund(options) {
    const { order, amount, reason, config } = options;
    
    try {
      // 计算需要退还的积分
      const rate = config.rate || 100;
      const refundPoints = Math.ceil(amount * rate);
      
      // 模拟网络请求
      await delay(500);
      
      // 在实际项目中，应该调用服务端接口退还用户积分
      // 这里仅作为演示
      
      return {
        success: true,
        message: '退款成功',
        refundId: 'virtual_refund_' + Date.now(),
        orderId: order.id,
        amount,
        points: refundPoints,
        paymentType: 'virtual'
      };
    } catch (error) {
      console.error('虚拟货币退款失败:', error);
      return { 
        success: false,
        message: '退款失败: ' + (error.message || error),
        error,
        orderId: order.id
      };
    }
  }
} 